package com.skyable.common.api.cloud;

import com.skyable.common.annotation.*;
import com.skyable.common.utils.SaApiUtil;

import java.util.Map;

/**
 * @author GaoYuan
 * @date 2019/11/5 11:20
 * @desc 设备接入层接口API
 */
@SaFeignClient
public interface SaService {
    /* zc-gateway接口---------------------------------------------------------------------------------------------------------------- */
    /**
     * 查看设备信息
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/getDevice")
    String gGetDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                      @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);


    /**
     * 获取设备在线状态
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/isDeviceOnline")
    String gIsDeviceOnline(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 通知 WiFi 模块上报信号质量
     * @param domainId
     * @param physicalDeviceId 设备物理 id
     *    requestBody:
     *    type    Integer  允许值: 1, 2, 3  类型, 1(仅获取WiFi当前的链路质量), 2(配置WiFi定时上报链路质量的周期；此时Msg的第二、三字节表征周期的时长，单位为秒), 3(获取WiFi无线链路的全量信息，包括：WiFi连接的路由器的SSID，WiFi接收到的信号的质量等级，WiFi的内网IP地址，WiFi的MAC地址)
     *    reportInterval 可选   Integer 上报间隔(秒)
     */
    @SaRequestMapping("/zc-gateway/v1/notifyWiFiReportLinkQuality")
    String notifyWiFiReportLinkQuality(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                       @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                                       @SaRequestBody Map<String, Object> hashMap);



    @SaRequestMapping("/zc-gateway/v1/notifyWiFiReportMessageTimestamp")
    String notifyWiFiReportMessageTimestamp(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                            @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                                            @SaRequestBody Map<String, Object> hashMap);



    /**
     * 执行 http OTA
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    srcVersion   String    源版本
     *    desVersion   String   目标版本
     *    otaType   String     ota 类型 允许值: system, commModule
     *    otaMode   String    ota 模式  允许值: confirm, force, silent
     *    versionDesc  可选   String    ota 版本描述
     *    files    map[]    OTA文件
     */
    @SaRequestMapping("/zc-gateway/v1/sendHttpOta")
    String sendHttpOta(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                       @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                       @SaRequestBody Map<String, Object> hashMap);


    /**
     *
     * @param domainId
     * @param physicalDeviceId 设备物理 id
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/notifyWiFiReportRedirectInfo")
    String notifyWiFiReportRedirectInfo(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                        @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     *
     * @param domainId
     * @param physicalDeviceId 设备物理 id
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/notifyWiFiReportRestartInfo")
    String notifyWiFiReportRestartInfo(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                       @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     *
     * @param domainId
     * @param physicalDeviceId 设备物理 id
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/notifyWiFiReportSDKErrorStat")
    String notifyWiFiReportSDKErrorStat(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                        @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 下线设备
     * @param domainId
     * @param physicalDeviceId 设备物理 ID (不区分大小写)
     * @return
     */
    @SaRequestMapping("/zc-gateway/v1/offlineDevice")
    String offlineDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);


    /**
     * 给 WiFi 发送 AT 指令
     * @param domainId
     * @param physicalDeviceId 设备物理 ID
     *    requestBody:
     *    command    String  AT 指令
     */
    @SaRequestMapping("/zc-gateway/v1/sendATCmdToWiFi")
    String sendATCmdToWiFi(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                           @SaRequestBody Map<String, Object> hashMap);


    /**
     * 切换 WiFi 功耗模式
     * @param domainId
     * @param physicalDeviceId 设备物理 ID
     *    requestBody:
     *    mode   String  功耗模式 允许值: low, high
     */
    @SaRequestMapping("/zc-gateway/v1/switchWiFiPowerMode")
    String switchWiFiPowerMode(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                               @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                               @SaRequestBody Map<String, Object> hashMap);


    /**
     * 向设备发送指令 :code(指令码), :desc(描述), :ack(1表示不需要设备回响应)
     * @param domainId
     * @param physicalDeviceId 设备物理 ID
     *    paramMap:
     *    msgCode :指令码
     *    desc :描述
     *    ack :1 表示不需要设备回响应
     *    requestBody:
     *    body   Binary  二进制串(非 json 格式)
     */
    @SaRequestMapping(value = "/zc-gateway-mqtt/v1/sendToDevice",responseType = SaApiUtil.HEADER_CONTENT_TYPE_OCTET_STREAM)
    String sendToDeviceMQTT(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                            @SaRequestHeader("Content-Type") String contentType,
                            @SaRequestParam Map<String, Object> paramMap,
                            @SaRequestPayload byte[] payload);

    /**
     * 向设备发送指令 :code(指令码), :desc(描述), :ack(1表示不需要设备回响应)
     * @param domainId
     * @param physicalDeviceId 设备物理 ID
     *    paramMap:
     *    msgCode :指令码
     *    desc :描述
     *    ack :1 表示不需要设备回响应
     *    requestBody:
     *    body   Binary  二进制串(非 json 格式)
     */
    @SaRequestMapping(value = "/zc-gateway/v1/sendToDevice",responseType = SaApiUtil.HEADER_CONTENT_TYPE_OCTET_STREAM)
    String sendToDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                        @SaRequestHeader("Content-Type") String contentType,
                        @SaRequestParam Map<String, Object> paramMap,
                        @SaRequestPayload byte[] payload);

    /* zc-router接口---------------------------------------------------------------------------------------------------------------- */

    /**
     * 设备数据上报 :code(消息码) :ip(ip) :country(国家) :province(省) :city(城市), :time(时间, e.g. 2018-01-02T12:01:02.000Z)
     * @param domainId
     * @param subDomainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-router/v1/deviceDataReport?timestamp=:time&msgCode=:code&ip=:ip&country=:country&province=:province&city=:city")
    String deviceDataReport(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                            @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                            @SaRequestBody Map<String, Object> hashMap);


    /**
     * 设备状态上报
     * OTA 状态上报: otaStatus=send (下发URL成功), otaStatus=fail (下发URL失败)
     * @param domainId
     * @param subDomainId
     * @param physicalDeviceId
     *    requestBody:
     *    timestamp   String  时间戳 e.g. 2018-01-02T12:01:02.000Z
     *    ip  可选   String  ip 地址
     *    country  可选   String  国家
     *    province  可选   String  省
     *    city  可选   String  市
     *    status     String  设备状态
     *    detail  可选   map  状态或动作的详细信息
     */
    @SaRequestMapping("/zc-router/v1/deviceStatusReport")
    String deviceStatusReport(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                              @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                              @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                              @SaRequestBody Map<String, Object> hashMap);

    /**
     * 移除设备数据上报的 http server
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-router/v1/unsetDataReportServer")
    String unsetDataReportServer(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                 @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);


    /**
     * 移除设备状态数据上报的 http server
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-router/v1/unsetStatusReportServer")
    String unsetStatusReportServer(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                   @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);


    /**
     * 获取产品转发地址
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-router/v1/getForwardInfo")
    String getForwardInfo(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);

    /**
     * 设置设备数据上报转发地址
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    targetType   String  server的类型 custom(自定义http server), uds(私有云的 uds 服务) 默认值: custom 允许值: "custom", "uds"
     *    addrs     String[]   http server addr, 当 targetType="uds" 时需要设置
     *    serviceName  可选   String 服务名, 当 targetType="uds" 时需要设置
     *    uri  可选  String  资源定位 默认值: dataReport
     *    timeout  可选  Integer  超时时间(ms) 默认值: 1000
     *    retryCount  可选  Integer  失败重试次数 默认值: 0
     */
    @SaRequestMapping("/zc-router/v1/setDataReportServer")
    String setDataReportServer(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                               @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                               @SaRequestBody Map<String, Object> hashMap);

    /**
     * 设置设备状态上报转发地址
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    targetType     String   server的类型 custom(自定义http server), uds(私有云的 uds 服务) 默认值: custom 允许值: "custom", "uds"
     *    addrs     String[]  http server addr, 当 targetType="uds" 时需要设置
     *    serviceName  可选   String 服务名, 当 targetType="uds" 时需要设置
     *    uri  可选  String  资源定位 默认值: statusReport
     *    timeout  可选  Integer  超时时间(ms) 默认值: 1000
     *    retryCount  可选  Integer  失败重试次数 默认值: 0
     */
    @SaRequestMapping("/zc-router/v1/setStatusReportServer")
    String setStatusReportServer(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                                 @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                                 @SaRequestBody Map<String, Object> hashMap);


    /* zc-warehouse接口---------------------------------------------------------------------------------------------------------------- */

    /**
     * 创建主域
     * @param hashMap
     *    requestBody:
     *    majorDomainName     String  主域名
     *    majorDomainDesc  可选   String  主域描述 (<=1024字节)
     */
    @SaRequestMapping("/zc-warehouse/v1/createMajorDomain")
    String createMajorDomain(@SaRequestBody Map<String, Object> hashMap);


    /**
     * 删除设备
     * @param domainId
     * @param physicalDeviceId
     * @param hashMap
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deleteDevice")
    String deleteDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                        @SaRequestBody Map<String, Object> hashMap);


    /**
     * 删除主域
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deleteMajorDomain")
    String deleteMajorDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);


    /**
     * 创建子域
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    subDomainName     String  子域名
     *    subDomainDesc  可选   String  产品描述 ( <= 1024 字节)
     *    secType  可选   String  加密类型 允许值: aes, rsa
     */
    @SaRequestMapping("/zc-warehouse/v1/createSubDomain")
    String createSubDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestBody Map<String, Object> hashMap);

    /**
     * 删除子域
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deleteSubDomain")
    String deleteSubDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);

    /**
     * 记录设备下线
     * @param domainId
     * @param hashMap
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deviceOffline")
    String deviceOffline(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                         @SaRequestBody Map<String, Object> hashMap);


    /**
     * 获取云端公钥
     * @param hashMap
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getCloudPubKey")
    String getCloudPubKey(@SaRequestBody Map<String, Object> hashMap);


    /**
     * 获取设备公钥
     * @param domainId
     * @param physicalDeviceId
     * @param hashMap
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getDevicePubKey")
    String getDevicePubKey(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                           @SaRequestBody Map<String, Object> hashMap);


    /**
     * 查看主域信息
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getMajorDomain")
    String getMajorDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);


    /**
     * 查询子域
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getSubDomain")
    String getSubDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);

    /**
     * 查看设备是否存在
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/isDeviceExist")
    String isDeviceExist(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 查看主域是否存在
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/isMajorDomainExist")
    String isMajorDomainExist(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);


    /**
     * 查看子域是否存在
     * @param domainId
     * @param subDomainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/isSubDomainExist")
    String isSubDomainExist(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId);

    /**
     * 列出所有主域信息
     */
    @SaRequestMapping("/zc-warehouse/v1/listMajorDomains")
    String listMajorDomains();

    /**
     * 列出所有子域
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/listSubDomains")
    String listSubDomains(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);

    /**
     * 获取设备数量
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    online 可选    Boolean 是否在线
     *    active 可选   Boolean 是否激活
     *    devType 可选   String  设备类型  允许值: embedded, gprs, linux/windows/android
     *    devVersion 可选   String  mcu 版本
     *    modVersion 可选   String  通信模组版本
     *    importTimeStart 可选   String  开始导入时间 (iso8601标准)
     *    importTimeEnd 可选   String  结束导入时间 (iso8601标准)
     *    firstActiveTimeStart 可选   String  第一次激活时间开始 (iso8601标准)
     *    firstActiveTimeEnd 可选   String  第一次激活时间结束 (iso8601标准)
     *    lastActiveTimeStart 可选   String  最后一次上线时间开始 (iso8601标准)
     *    lastActiveTimeEnd 可选   String  取后一次上线时间结束 (iso8601标准)
     *    physicalDeviceId 可选   String  设备物理 id, 模糊匹配
     */
    @SaRequestMapping("/zc-warehouse/v1/getDeviceCount")
    String getDeviceCount(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                          @SaRequestBody Map<String, Object> hashMap);

    @SaRequestMapping("/zc-warehouse/v1/getDeviceCount")
    String getDeviceCount(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestBody Map<String, Object> hashMap);
    /**
     * 查询设备信息
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    offset 可选    Integer 查询起始索引 默认值: 0
     *    count 可选    Integer 要查询的设备数量 默认值: 20
     *    direction 可选    Integer 排序方式 默认值: desc 允许值: asc, desc
     *    sort 可选    Integer 排序字段 默认值: physicalDeviceId 允许值: physicalDeviceId, importTime, firstActiveTime, lastActiveTime
     *    online 可选    Boolean 是否在线
     *    active 可选   Boolean 是否激活
     *    devType 可选   String  设备类型  允许值: embedded, gprs, linux/windows/android
     *    devVersion 可选   String  mcu 版本
     *    modVersion 可选   String  通信模组版本
     *    importTimeStart 可选   String  开始导入时间 (iso8601标准)
     *    importTimeEnd 可选   String  结束导入时间 (iso8601标准)
     *    firstActiveTimeStart 可选   String  第一次激活时间开始 (iso8601标准)
     *    firstActiveTimeEnd 可选   String  第一次激活时间结束 (iso8601标准)
     *    lastActiveTimeStart 可选   String  最后一次上线时间开始 (iso8601标准)
     *    lastActiveTimeEnd 可选   String  取后一次上线时间结束 (iso8601标准)
     *    physicalDeviceId 可选   String  设备物理 id, 模糊匹配
     */
    @SaRequestMapping("/zc-warehouse/v1/listDevices")
    String listDevices(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                       @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                       @SaRequestBody Map<String, Object> hashMap);

    /**
     * 导入单个设备信息
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    physicalDeviceId     String 设备物理 id
     *    pubKey     String 设备公钥
     *    devVersion     String mcu 版本
     *    modVersion     String 通信模块版本
     */
    @SaRequestMapping("/zc-warehouse/v1/importDevice")
    String importDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                        @SaRequestBody Map<String, Object> hashMap);

    /**
     * 批量导入设备信息
     * @param domainId
     * @param subDomainId
     *    requestBody:
     *    devices     map[] 设备列表
     */
    @SaRequestMapping("/zc-warehouse/v1/importDevices")
    String importDevices(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 删除设备
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deleteDevice")
    String deleteDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 查看单个设备信息
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getDevice")
    String wGetDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                      @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 激活设备
     * @param domainId
     * @param subDomainId
     * @param physicalDeviceId
     * @param hashMap
     *    requestBody:
     *    timestamp     String  时间戳
     *    devType    可选  String  设备类型 允许值: embedded, gprs, linux/windows, android
     *    devVersion    可选  String  MCU 版本
     *    modVersion    可选  String  通信模组版本
     *    mac    可选  String  mac 地址
     *    ip    可选 String  设备 ip 地址
     *    country  可选   String 可选  国家
     *    province    可选  String 省
     *    city    可选  String  城市
     */
    @SaRequestMapping("/zc-warehouse/v1/activateDevice")
    String activateDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                          @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                          @SaRequestBody Map<String, Object> hashMap);

    /**
     * 反激活设备
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/antiActivateDevice")
    String antiActivateDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                              @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 记录设备心跳
     * @param domainId
     * @param physicalDeviceId
     *    requestBody:
     *    timestamp     String  心跳时间 (iso8601标准)
     */
    @SaRequestMapping("/zc-warehouse/v1/deviceHeartbeat")
    String deviceHeartbeat(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                           @SaRequestBody Map<String, Object> hashMap);

    /**
     * 记录设备下线
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/deviceOffline")
    String deviceOffline(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 获取云端公钥
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getCloudPubKey")
    String getCloudPubKey();

    /**
     * 获取设备公钥
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/getDevicePubKey")
    String getDevicePubKey(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 获取多个设备信息
     * @param domainId
     * @param subDomainId
     *    requestBody:
     *    physicalDeviceIds     String[]  设备物理 id 列表
     *    devType   可选	  String 设备类型 允许值: embedded, gprs, linux/windows, android
     *    devVersion   可选	  String 通信模块版本
     *    modVersion   可选	  MCU 版本
     *    online   可选	  在线状态
     *    active   可选	  激活状态
     */
    @SaRequestMapping("/zc-warehouse/v1/getDevices")
    String getDevices(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                      @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                      @SaRequestBody Map<String, Object> hashMap);

    /**
     * 获取设备在线状态
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-warehouse/v1/isDeviceOnline")
    String wIsDeviceOnline(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 查看设备版本列表
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    type     String  类型 (mcu or wifi) 允许值: system, commModule
     */
    @SaRequestMapping("/zc-warehouse/v1/listDeviceVersions")
    String listDeviceVersions(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                              @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                              @SaRequestBody Map<String, Object> hashMap);


    /* zc-ota接口---------------------------------------------------------------------------------------------------------------- */
    /**
     * 修改 ota 任务
     * @param domainId
     *    requestBody:
     *    taskId     Integer ota 任务 id
     *    physicalDeviceIds     String[]	 OTA 设备列表
     */
    @SaRequestMapping("/zc-ota/v1/modifyOtaTask")
    String modifyOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 开始执行单个设备 ota
     * @param domainId
     * @param physicalDeviceId 设备物理 ID
     * @param devVersion mcu 版本
     * @param modVersion 通信模块版本
     * @param devType 设备类型 允许值: embedded, gprs, linux/windows, android
     * @return
     */
    @SaRequestMapping("/zc-ota/v1/startOtaDevice")
    String startOtaDevice(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                          @SaRequestHeader("devVersion") String devVersion,
                          @SaRequestHeader("modVersion") String modVersion,
                          @SaRequestHeader("devType") String devType);

    /**
     * 查询OTA版本列表
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-ota/v1/listOtaVersions")
    String listOtaVersions(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);


    /**
     * 查看所有 ota 任务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    status  可选   String  任务状态 允许值: start, stop
     *    desVersionId  可选   Integer  目标 ota 版本 id
     */
    @SaRequestMapping("/zc-ota/v1/listOtaTasks")
    String listOtaTasks(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestBody Map<String, Object> hashMap);

    /**
     * 依据版本id获取ota版本具体信息
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    versionId     Integer  ota 版本 id
     */
    @SaRequestMapping("/zc-ota/v1/getOtaVersion")
    String getOtaVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 获取OTA任务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    taskId     Integer  ota 任务 id
     */
    @SaRequestMapping("/zc-ota/v1/getOtaTask")
    String getOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                      @SaRequestBody Map<String, Object> hashMap);

    /**
     * 查看单个 ota 任务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    version     String 版本名
     *    otaType     String ota 类型, system(MCU升级), commModule(通信模组升级)  允许值: system, commModule
     *    versionDesc  可选   String 版本描述
     *    files    map[]  ota 文件列表 (tag为1~255之间的值，不可以重复)
     */
    @SaRequestMapping("/zc-ota/v1/createOtaVersion")
    String createOtaVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);

    /**
     * 创建OTA任务
     * @param domainId
     * @param subDomainId
     * @param hashMap
     *    requestBody:
     *    taskMode     String 升级方式, confirm(用户确认升级, 需要经过用户同意），force (强制升级, 不需要用户同意), silent (静默升级，选择升级的时间段)
     *    taskDesc     String 任务描述
     *    otaType     String 任务类型   system,commModule
     *    startTime   可选   String   开始升级时间，升级方式为 silent 时有效 (iso8601标准)
     *    endTime   可选   String     结束升级时间，升级方式为 silent 时有效 (iso8601标准)
     *    srcVersion     String   源版本
     *    desVersionId     Integer   目标版本 id
     *    physicalDeviceIds   可选   String[]    设备物理 ID 列表
     */
    @SaRequestMapping("/zc-ota/v1/createOtaTask")
    String createOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 删除OTA版本
     * @param domainId
     * @param hashMap
      *    requestBody:
      *    versionId     Integer ota版本id
     */
    @SaRequestMapping("/zc-ota/v1/deleteOtaVersion")
    String deleteOtaVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);

    /**
     * 删除OTA任务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    taskId     Integer ota 任务 id
     */
    @SaRequestMapping("/zc-ota/v1/deleteOtaTask")
    String deleteOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 开启OTA任务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    taskId   Integer    ota 任务 id
     */
    @SaRequestMapping("/zc-ota/v1/startOtaTask")
    String startOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestBody Map<String, Object> hashMap);

    /**
     * 停止OTA任务
     * @param domainId
     * @param hashMap
     * @return
     */
    @SaRequestMapping("/zc-ota/v1/stopOtaTask")
    String stopOtaTask(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                       @SaRequestBody Map<String, Object> hashMap);

    /**
     * 不执行调度, 直接升级
     * @param domainId
     * @param physicalDeviceId
     * @param hashMap
     *    requestBody:
     *    srcVersion   String    源版本
     *    desVersionId   Integer   版本唯一 id
     *    otaType   String     ota 类型 允许值: system, commModule
     */
    @SaRequestMapping("/zc-ota/v1/sendHttpOta")
    String otaSendHttpOta(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                          @SaRequestBody Map<String, Object> hashMap);


    /**
     * 查看设备的升级信息
     * @param domainId
     * @param physicalDeviceId
     *    requestBody:
     *    srcVersion   String    源版本
     */
    @SaRequestMapping("/zc-ota/v1/checkUpdate")
    String checkUpdate(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                       @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);

    /**
     * 确认OTA升级
     * @param domainId
     * @param physicalDeviceId
     * @param hashMap
     *    requestBody:
     *    taskId   Integer    任务 id
     */
    @SaRequestMapping("/zc-ota/v1/confirmUpdate")
    String confirmUpdate(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                         @SaRequestBody Map<String, Object> hashMap);

    /* zc-redirect接口---------------------------------------------------------------------------------------------------------------- */

    /**
     * 清空主域对应的 zc-redirect 环境
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-redirect/v1/clearMajorDomain")
    String clearMajorDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);


    /**
     * 获取设备所在的 gateway
     * @param domainId
     * @param physicalDeviceId
     * @return
     */
    @SaRequestMapping("/zc-redirect/v1/getAccessPoint")
    String getAccessPoint(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId);


    /**
     * 创建主域对应的 zc-redirect 环境
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-redirect/v1/initMajorDomain")
    String initMajorDomain(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);

    /**
     * 获取所有 gateway 的信息
     * @return
     */
    @SaRequestMapping("/zc-redirect/v1/listGateways")
    String listGateways();


    /**
     * 记录设备所在的 gateway
     * @param domainId
     * @param subDomainId
     * @param physicalDeviceId
     * @param hashMap
     *    requestBody:
     *    nodeName   String    gateway 名字
     *    serviceName   String    服务名
     *    gatewayInnerIP	   String    对内 ip
     *    gatewayInnerPort   Integer    对内端口
     *    gatewayOuterIP   String    对外 ip
     *    gatewayOuterPort	   Integer    对外端口
     */
    @SaRequestMapping("/zc-redirect/v1/setAccessPoint")
    String setAccessPoint(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestHeader("X-Zc-Sub-Domain-Id") Long subDomainId,
                          @SaRequestHeader("X-Zc-Physical-Device-Id") String physicalDeviceId,
                          @SaRequestBody Map<String, Object> hashMap);

    /* zc-uds接口---------------------------------------------------------------------------------------------------------------- */

    /**
     * 创建服务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceName   String   服务名
     *    serviceDesc   String   服务描述
     *    serviceType	   String   服务类型 允许值: "uds_java"
     *    memoryBytes  可选   Integer   内存上限 默认值: 536870912
     *    instanceNum  可选   Integer   实例数 默认值: 1
     *    logLevel  可选   Integer   日志级别 默认值: info
     */
    @SaRequestMapping("/zc-uds/v1/createUdsService")
    String createUdsService(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);


    /**
     * 创建服务版本
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    majorVersion   Integer   主版本号
     *    minorVersion	   Integer   小版本号
     *    patchVersion	   Integer   path 版本号
     *    versionDesc	 String   版本描述
     *    url	 String   UDS url
     */
    @SaRequestMapping("/zc-uds/v1/createUdsVersion")
    String createUdsVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);


    /**
     * 删除服务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     */
    @SaRequestMapping("/zc-uds/v1/deleteUdsService")
    String deleteUdsService(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);

    /**
     * 删除版本
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    versionId   Integer   版本 id
     */
    @SaRequestMapping("/zc-uds/v1/deleteUdsVersion")
    String deleteUdsVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                            @SaRequestBody Map<String, Object> hashMap);

    /**
     * 获取服务信息
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     */
    @SaRequestMapping("/zc-uds/v1/getUdsService")
    String getUdsService(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     * 获取版本信息
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    versionId   Integer   版本 id
     */
    @SaRequestMapping("/zc-uds/v1/getUdsVersion")
    String getUdsVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                         @SaRequestBody Map<String, Object> hashMap);

    /**
     *
     * @param hashMap
     *    requestBody:
     *    image   String
     *    tag   String
     */
    @SaRequestMapping("/zc-uds/v1/isImageExist")
    String isImageExist(@SaRequestBody Map<String, Object> hashMap);

    /**
     * 获取服务列表
     * @param domainId
     * @return
     */
    @SaRequestMapping("/zc-uds/v1/listUdsServices")
    String listUdsServices(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId);

    /**
     * 获取服务版本列表
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     */
    @SaRequestMapping("/zc-uds/v1/listUdsVersions")
    String listUdsVersions(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestBody Map<String, Object> hashMap);

    /**
     * 修改 uds 实例数
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    instanceNum   Integer   实例数
     */
    @SaRequestMapping("/zc-uds/v1/modifyInstanceNum")
    String modifyInstanceNum(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                             @SaRequestBody Map<String, Object> hashMap);


    /**
     * 修改 uds 内存
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    memoryBytes   Integer   内存大小
     */
    @SaRequestMapping("/zc-uds/v1/modifyMemory")
    String modifyMemory(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                        @SaRequestBody Map<String, Object> hashMap);

    /**
     * 启动 UDS 服务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    versionId   Integer   版本 id
     */
    @SaRequestMapping("/zc-uds/v1/startUdsVersion")
    String startUdsVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                           @SaRequestBody Map<String, Object> hashMap);


    /**
     * 停止 UDS 服务
     * @param domainId
     * @param hashMap
     *    requestBody:
     *    serviceId   Integer   服务 id
     *    versionId   Integer   版本 id
     */
    @SaRequestMapping("/zc-uds/v1/stopUdsVersion")
    String stopUdsVersion(@SaRequestHeader("X-Zc-Major-Domain-Id") Long domainId,
                          @SaRequestBody Map<String, Object> hashMap);

}
